package com.itlong.cloud.commons.dao;

import com.itlong.cloud.POJO.DTO.property.PaymentParkingCostsDTO;
import com.itlong.cloud.POJO.PO.*;
import com.itlong.cloud.POJO.VO.property.PropertyPaymentTradeInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyPaymentTradeVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *     微信支付数据访问接口
 * </desc>
 *
 * @createDate 2018/4/23
 */

@Mapper
@Repository
public interface IPaymentTradeDao {

    /**
     * <desc>
     *      保存订单
     * <desc/>
     *
     * @param  params   订单信息
     * @return
     * @author Juguang.S
     * @createDate 2018/4/23
     */
    void save(Map<String, Object> params);

    /**
     * <desc>
     *      根据订单号查询订单
     * <desc/>
     *
     * @param  tradeId   订单号
     * @return
     * @author Juguang.S
     * @createDate 2018/4/23
     */
    PaymentTradePO getOrderByTradeId(@Param("tradeId") String tradeId);

    /**
     * <desc>
     *      更新订单
     * <desc/>
     *
     * @param  params   订单信息
     * @return
     * @author Juguang.S
     * @createDate 2018/4/23
     */
    void update(Map<String, Object> params);

    /**
     * <desc>
     *      检查当前订单状态是否为支付成功
     * </desc>
     *
     * @param billsId 订单号
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/27
     */
    Integer checkTradeSuccess(@Param("billsId") String billsId,@Param("userId") String userId,@Param("tradeId") String tradeId);

    /**
     * <desc>
     *      根据月卡停车账单号查询账单中的月份
     * </desc>
     *
     * @param feeId 账单id
     * @return
     * @author Juguang.S
     * @createDate 2018/8/27
     */
    Map<String,Object> getPropertyPaymentBillInfo(@Param("feeId") String feeId);

    /**
     * <desc>
     *      根据所下载对账单的日期查询当日的订单信息
     * </desc>
     *
     * @param billTime 日期
     * @return
     * @author Juguang.S
     * @createDate 2018/8/30
     */
    List<PaymentTradePO> getOrderByBillDate(@Param("billTime") String billTime);

    /**
     * <desc>
     *      批量保存
     * </desc>
     *
     * @param params 待保存的信息列表
     * @return 受影响的行数
     * @author Juguang.S
     * @createDate 2018/8/30
     */
    Integer batchSave(List<Map<String, Object>> params);

    /**
     * <desc>
     *      根据订单号查询是否因微信日切早于商户而造成的订单出入
     * </desc>
     *
     * @param wechatTradeId 商户订单号
     * @param wechatAccount 微信订单中的成交金额
     * @return 受影响的行数
     * @author Juguang.S
     * @createDate 2018/8/31
     */
    Integer getIsCheckDiffBillByTradeId(@Param("wechatTradeId") String wechatTradeId,@Param("wechatAccount") String wechatAccount);

    /**
     * <desc>
     *      根据订单号修改出入订单的状态
     * </desc>
     *
     * @param wechatTradeId 商户订单号
     * @author Juguang.S
     * @createDate 2018/8/31
     */
    void updateDiffOrderStatus(@Param("wechatTradeId") String wechatTradeId);

    /**
     * <desc>
     *      根据商户订单号查询出入表中是否已有金额不一致的数据
     * </desc>
     *
     * @param wechatTradeId 商户订单号
     * @author Juguang.S
     * @createDate 2018/9/12
     */
    Integer getInconsistentAmountByTradeId(@Param("wechatTradeId") String wechatTradeId);

    /**
     * <desc>
     *      根据账单号查询该账单所属的项目编号
     * </desc>
     *
     * @param feeId 账单id
     * @return
     * @author Juguang.S
     * @createDate 2018/9/25
     */
    String getBillForProject(@Param("feeId") String feeId);

    /**
     * <desc>
     *      查询第三方支付管理微信支付是否被禁用
     * <desc/>
     * @param thirdPayType 1微信支付 2银联转账
     * @return
     * @author Juguang.S
     * @createDate 2018/9/26
     */
    Integer getThirdPayStatus(@Param("thirdPayType") Integer thirdPayType);

    /**
     * <desc>
     *      统计前一天的交易成功的订单总金额
     * </desc>
     *
     * @param billTime 前一天
     * @author Juguang.S
     * @createDate 2018/9/27
     */
    String getTradeTotal(@Param("billTime") String billTime);

    /**
     * <desc>
     *      查询该账单是否已被支付
     * <desc/>
     * @param billsId 账单编号
     * @return
     * @author Juguang.S
     * @createDate 2018/10/09
     */
    Integer getBillStatus(@Param("billsId") String[] billsId);

    /**
     * <desc>
     *      查询子账单中的抄表费和物业费是否已被支付
     * <desc/>
     * @param type 子账单类型 1电费 4物业费 feeId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/10/19
     */
    Integer getBillStatusByType(@Param("type") String type,@Param("feeId") String feeId);

    /**
     * <desc>
     *      根据账单编号查询子账单中的抄表费的总金额
     * <desc/>
     * @param feeId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/10/19
     */
    Map<String,Object> getMeterPayTotal(@Param("feeId") String feeId);

    /**
     * <desc>
     *      根据账单编号查询子账单中的物业费的总金额
     * <desc/>
     * @param feeId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/10/19
     */
    Map<String,Object> getPropertyPayTotal(@Param("feeId") String feeId);

    /**
     * <desc>
     *      根据账单编号查询子账单中的总金额
     * <desc/>
     * @param feeId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/10/19
     */
    Map<String,Object> getBillPayTotal(@Param("feeId") String feeId);

    /**
     * <desc>
     *      更新子账单中的支付状态
     * <desc/>
     * @param strArr 类型数组 feeId 账单编号
     * @return
     * @author Juguang.S
     * @createDate 2018/10/19
     */
    Integer updatePayStatus(@Param("strArr") String[] strArr,@Param("feeId") String feeId);

    /**
     * <desc>
     *      获取此时月卡有效期的截止日期
     * </desc>
     *
     * @param carId 车辆ID
     * @return
     * @author Juguang.S
     * @createDate 2018/11/07
     */
    String getMonthCarEndTime(@Param("carId") String carId);

    /**
     * <desc>
     *      根据账单ID获取车牌号
     * </desc>
     *
     * @param billId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/11/15
     */
    Map<String,String> getCarNumByBillId(@Param("billId") String billId);

    /**
     * <desc>
     *      根据账单ID获取临时车到账通知信息
     * </desc>
     *
     * @param billId 账单ID
     * @return
     * @author Juguang.S
     * @createDate 2018/11/15
     */
    PaymentParkingCostsDTO getTemCarInfoByBillId(@Param("billId") String billId);

    /**
     * <desc>
     *      根据carId判断此次是否是首次交月卡费
     * </desc>
     *
     * @param carId
     * @return
     * @author Juguang.S
     * @createDate 2019/01/12
     */
    Integer getFirstPayMonthCardFee(@Param("carId") String carId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据项目ID查询分润规则
     * </desc>
     *
     * @param projectId 项目编号
     * @return 分润规则
     * @author wangzhi
     * @createDate 2019/05/21
     */
    ShareProfitRuleInfoPO getShareProfitByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      分页查询付费通行订单
     * </desc>
     *
     * @param params 查询参数
     * @return 付费通行订单分页列表
     * @author wangzhi
     * @createDate 2019/05/23
     */
    List<PropertyPaymentTradeVO> getPage(Map<String, Object> params);

    /**
     * <desc>
     *      查询付费通行订单总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 付费通行订单总记录数
     * @author wangzhi
     * @createDate 2019/05/23
     */
    Integer getRecordCount(Map<String, Object> params);

    /**
     * <desc>
     *      条件查询导出的付费通行订单列表
     * </desc>
     *
     * @param params 查询参数
     * @return 导出的付费通行订单列表
     * @author wangzhi
     * @createDate 2019/05/23
     */
    List<PropertyPaymentTradeVO> getAllData(Map<String, Object> params);

    /**
     * <desc>
     *      订单id查询导出的付费通行订单列表
     * </desc>
     *
     * @param tradeIdList 订单id集合
     * @return 导出的付费通行订单列表
     * @author wangzhi
     * @createDate 2019/05/23
     */
    List<PropertyPaymentTradeVO> getDataByTradeIds(@Param("list") List<String> tradeIdList, @Param("projectId") String projectId);

    /**
     * <desc>
     *      查询账单地址
     * </desc>
     *
     * @param feeId 账单id
     * @return 账单地址
     * @author wangzhi
     * @createDate 2019/05/27
     */
    String getBillAddress(@Param("feeId") String feeId);

    /**
     * <desc>
     *      查询该账单地址是否限欠费名单
     * </desc>
     *
     * @param feeId 账单id
     * @return 房间id
     * @author wangzhi
     * @createDate 2019/05/27
     */
    String getRoomManage(String feeId);

    /**
     * <desc>
     *      根据项目编号查询当前项目的增值信息
     * </desc>
     *
     * @param projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2019/05/28
     */
    PropertyValuePO getPropertyValueInfo(String projectId);

    /**
     * <desc>
     *      根据用户和项目查询总房间数
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2019/05/28
     */
    String getRoomIdsByUser(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据账单编号更新房间欠费状态
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param arrearageStatus 房屋欠费状态, 0代表否, 1代表是
     * @return
     * @author Qiang.S
     * @createDate 2019/05/30
     */
    Integer updateRoomArrearageStatusByFeeId(@Param("userId") String userId, @Param("projectId") String projectId, @Param("arrearageStatus") Integer arrearageStatus);

    /**
     * <desc>
     *      根据用户编号更新项目下业主房间为不欠费
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param arrearageStatus 用户欠费状态, 0代表否, 1代表是
     * @return
     * @author Qiang.S
     * @createDate 2019/05/30
     */
    Integer updateUserProject(@Param("userId") String userId, @Param("projectId") String projectId, @Param("arrearageStatus") Integer arrearageStatus);

    /**
     * <desc>
     *      查询账单下所有的房间
     * </desc>
     *
     * @param feeIds 多个账单编号，以逗号隔开
     * @return
     * @author Qiang.S
     * @createDate 2019/06/04
     */
    List<String> getAllRoomByBill(@Param("feeIds") String[] feeIds);

    /**
     * <desc>
     *      根据账单ID查询账单实缴金额
     * </desc>
     *
     * @param feeId 账单id
     * @return 分润规则
     * @author wangzhi
     * @createDate 2019/07/03
     */
    String getPaidAmountByFeeId(@Param("feeId") String feeId);

    /**
     * <desc>
     *      查询该项目绑定的商户号
     * </desc>
     *
     * @param projectId 项目编号
     * @return 该项目绑定的商户号
     * @author wangzhi
     * @createDate 2019/09/10
     */
    WeChatOfficialAuthInfoPO getWeChatAuthMchId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据账单ID更新云服务费订单表
     * </desc>
     *
     * @param feeId 账单id
     * @return
     * @author Juguang.S
     * @createDate 2019/08/12
     */
    Integer updateCloudServiceCostOrder(@Param("feeId") String feeId);

    /**
     * <desc>
     *      更新项目云服务管理信息表中的该项目的过期时间
     * </desc>
     *
     * @param feeId 账单id
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/08/12
     */
    Integer updateProjectCloudServerManage(@Param("feeId") String feeId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据账单号查询该云服务费账单所属的项目编号
     * </desc>
     *
     * @param feeId 账单id
     * @return
     * @author Juguang.S
     * @createDate 2019/8/20
     */
    String getOrderForProject(@Param("feeId") String feeId);

    /**
     * <desc>
     *      根据订单号获取云服务费的金额
     * <desc/>
     *
     * @param  billsId   订单编号
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    String getTotalByCloudServiceCost(@Param("billsId") String billsId);

    /**
     * <desc>
     *      根据订单号获取除云服务费外的金额
     * <desc/>
     *
     * @param  billsId   订单编号
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    String getTotalByBillId(@Param("billsId") String[] billsId);

    /**
     * <desc>
     *      条件查询所有支付订单信息
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/18
     */
    List<PropertyPaymentTradeInfoVO> getPaymentTradeByPage(Map<String,Object> params);

    /**
     * <desc>
     *      统计查询的所有支付订单信息总数
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/18
     */
    Integer getPaymentTradeCount(Map<String, Object> params);

    /**
     * <desc>
     *      运营获取直接到账的支付订单列表
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/23
     */
    List<PropertyPaymentTradeInfoVO> getOperatePaymentTradeByPage(Map<String,Object> params);

    /**
     * <desc>
     *      统计运营直接到账的支付订单总数
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/23
     */
    Integer getOperatePaymentTradeCount(Map<String, Object> params);

    /**
     * <desc>
     *      统计所查询出直接到账订单的总金额
     * </desc>
     *
     * @param params
     * @return
     * @Author Zhu.yj
     * @createDate  2019/10/23
     */
    String getOperatePaymentTradePriceCount(Map<String, Object> params);

    /**
     * <desc>
     *      根据项目ID查询项目信息
     * </desc>
     *
     * @param projectId 项目编号
     * @return 项目信息
     * @author wangzhi
     * @createDate 2019/10/24
     */
    ProjectPO getProjectInfo(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据订单号获取除云服务费批次号相关设备信息
     * <desc/>
     *
     * @param  orderId   订单编号
     * @return
     * @author Juguang.S
     * @createDate 2019/11/26
     */
    List<Map<String,String>> getDeviceInfoByBatchNumber(@Param("orderId") String orderId);

    /**
     * <desc>
     *      获取项目下的云对讲设备信息
     * <desc/>
     *
     * @param  projectId   项目编号
     * @return
     * @author Juguang.S
     * @createDate 2020/02/21
     */
    List<Map<String,String>> getCloudTalkInfoByProjectId(@Param("projectId") String projectId);


    /**
     * <desc>
     *      将电梯设备旧批次号改为新批次号
     * <desc/>
     *
     * @param  batchNumbers   旧批次集合
     * @param  batchNumber   新批次
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    Integer updateElevatorBatchNumber(@Param("batchNumbers") String[] batchNumbers,@Param("batchNumber") String batchNumber);

    /**
     * <desc>
     *      将门禁设备旧批次号改为新批次号
     * <desc/>
     *
     * @param  batchNumbers   旧批次集合
     * @param  batchNumber   新批次
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    Integer updateEntranceBatchNumber(@Param("batchNumbers") String[] batchNumbers,@Param("batchNumber") String batchNumber);

    /**
     * <desc>
     *      将云对讲设备旧批次号改为新批次号
     * <desc/>
     *
     * @param  batchNumbers   旧批次集合
     * @param  batchNumber   新批次
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    Integer updateCloudIntercomBatchNumber(@Param("batchNumbers") String[] batchNumbers,@Param("batchNumber") String batchNumber);

    /**
     * <desc>
     *      将平板设备旧批次号改为新批次号
     * <desc/>
     *
     * @param  batchNumbers   旧批次集合
     * @param  batchNumber   新批次
     * @return
     * @author Juguang.S
     * @createDate 2019/9/17
     */
    Integer updatePadBatchNumber(@Param("batchNumbers") String[] batchNumbers,@Param("batchNumber") String batchNumber);

    /**
     * <desc>
     *      根据订单id查询套餐信息
     * <desc/>
     *
     * @param  tradeId   旧批次集合
     * @return
     * @author Qiang.S
     * @createDate 2020/07/17
     */
    Map<String,Object> getMealInfoByTradeId(String tradeId);

    /**
     * <desc>
     *      通过房间id查询房间二维码剩余次数
     * </desc>
     *
     * @param roomId 房间id
     * @return 用户id
     * @author wangzhi
     * @createDate 2019/10/10
     */
    PropertyRoomQrcodeBatchRecordPO getRoomQrCodeBatch(@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据房间Id查询项目编号
     * </desc>
     *
     * @param roomId 房间id
     * @return
     * @author Juguang.S
     * @createDate 2020/7/20
     */
    String getProjectByRoomId(@Param("roomId") String roomId);
}
